﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Iacym.Entities;
using Iacym.Repository;
using Microsoft.Practices.Unity;

namespace Iacym.BusinessLogic
{
    public class PersonaBL : IPersonaBL
    {
        [Dependency]
        public IPersonaRepository personarepository { get; set; }

        public List<PERSONA> GetAllFromPersona()
        {
            return personarepository.GetAllFromPersona();
        }

        public void AddPersona(PERSONA persona)
        {
            var msg = "";
            var ok = persona.Validate(out msg);
            if (ok)
            {
                var duplicidad = personarepository.DuplicidadPersona(persona.Dni, persona.Id);
                if (!duplicidad)
                {
                    var existImage = personarepository.ExistImagenHash(persona.FOTO_PERSONA.Hash, persona.Id);
                    if (existImage)
                    {
                        var error = string.Format("Ya existe una Persona con la misma imagen.");
                        throw new Exception(error);
                    }
                    else
                    {
                        personarepository.AddPersona(persona);
                    }                    
                }
                else
                {
                    var error = string.Format("Ya existe una Persona con el mismo DNI.");
                    throw new Exception(error);
                }
                
            }
            else
            {
                throw new Exception(msg);
            }
        }

        public void UpdatePersona(PERSONA persona)
        {
            var msg = "";
            var ok = persona.Validate(out msg);
            if (ok)
            {
                //personarepository.UpdatePersona(persona);
                var existImage = personarepository.ExistImagenHash(persona.FOTO_PERSONA.Hash, persona.Id);
                if (existImage)
                {
                    var error = string.Format("Ya existe una Persona con la misma imagen.");
                    throw new Exception(error);
                }
                else
                {
                    personarepository.UpdatePersona(persona);
                }
            }
            else
            {
                throw new Exception(msg);
            }
        }

        public void DeletePersona(int id)
        {
            throw new NotImplementedException();
        }


        public PERSONA GetFromPersonaById(int id)
        {
            return personarepository.GetFromPersonaById(id);
        }


        /* public PERSONA GetAllFromPersonaById(int id)
         {
             throw new NotImplementedException();
         }*/


        public PERSONA GetFromPersonaByDni(string dni)
        {
            return personarepository.GetFromPersonaByDni(dni);
        }

        public List<PERSONA> GetFromPersonaByDescripcion(string descripcion)
        {
            return personarepository.GetFromPersonaByDescripcion(descripcion);
        }


        public void AddPersonaConCargoIglesia(PERSONA persona)
        {
            personarepository.AddPersonaConCargoIglesia(persona);
        }

        public void UpdatePersonaConCargoIglesia(PERSONA persona)
        {
            personarepository.UpdatePersonaConCargoIglesia(persona);
        }


        public void DeletePersonaConCargoIglesia(int id)
        {
            personarepository.DeletePersonaConCargoIglesia(id);
        }


        public List<PERSONA> GetFromPersonaByDescripcionByCriteriosEspecificos(int idestadocivil, int idsexo, bool nocreyente, bool creyentelocal,/* bool creyentetransferencia, bool creyentetransferido, bool vivo, bool muerto, bool activo, bool noactivo,*/ string descripcion)
        {
            return personarepository.GetFromPersonaByDescripcionByCriteriosEspecificos(idestadocivil, idsexo, nocreyente, creyentelocal, /*creyentetransferencia, creyentetransferido, vivo, muerto, activo, noactivo,*/ descripcion);
        }


        public List<PERSONA> GetAllFromPersonaByFechaNac(int fecNacIni, int fecNacFin)
        {
            return personarepository.GetAllFromPersonaByFechaNac(fecNacIni, fecNacFin);
        }


        public List<PERSONA> GetFromPersonaByEspecialidad(string descripcion)
        {
            return personarepository.GetFromPersonaByEspecialidad(descripcion);
        }

        public List<PERSONA> GetFromPersonaByProfesion(string descripcion)
        {
            return personarepository.GetFromPersonaByProfesion(descripcion);
        }

        public List<PERSONA> GetFromPersonaByCargo(string descripcion)
        {
            return personarepository.GetFromPersonaByCargo(descripcion);
        }

        public List<PERSONA> GetFromPersonaByEmpresa(string descripcion)
        {
            return personarepository.GetFromPersonaByEmpresa(descripcion);
        }

        public List<PERSONA> GetFromPersonaByIdioma(string descripcion)
        {
            return personarepository.GetFromPersonaByIdioma(descripcion);
        }


        public PERSONA GetFromPersonaByNroMembresia(int membresia)
        {
            return personarepository.GetFromPersonaByNroMembresia(membresia);
        }


        public List<PERSONA> GetFromPersonaByDiscipulador(int id)
        {
            return personarepository.GetFromPersonaByDiscipulador(id);
        }
    }
}
